package com.joyoung.common.utils;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 集合工具类
 *
 */
@SuppressWarnings({"WeakerAccess", "unused"})
public final class CollectionUtil {

    /**
     * 合并列表相同项
     *
     * @param list   需要合并的列表
     * @param merger 合并器
     * @param <K>    Key 类型
     * @param <E>    Item类型
     * @return 合并之后的列表
     */
    @SuppressWarnings({"unchecked"})
    public static <K, E> List<E> mergeList(List<E> list, Merger<K, E> merger) {
        if (list == null || list.isEmpty()) {
            return list;
        }
        Map<K, E> map = new LinkedHashMap<>();
        for (E item : list) {
            if (item == null) {
                continue;
            }
            K key = merger.getKey(item);
            if (map.containsKey(key)) {
                merger.merge(map.get(key), item);
            } else {
                map.put(key, item);
            }
        }
        return new ArrayList<>(map.values());
    }

    public interface Merger<T, E> {

        /** 相同key进行合并 */
        T getKey(E element);

        void merge(E elementExist, E elementTarget);
    }
}
